# $Id: rfc4193.py 7557b5d4d82b 2012/12/02 09:07:16 pgurumur $
# Copyright (c) 2009 Prabhu Gurumurthy  <pgurumur@gmail.com>
# 
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#

import optparse

from django.conf import settings

from djanet.db import netdb, query
from djanet.lib import ip, stdlib, log
from djanet.tools.lib import ipv6, getopts, util

class Command(getopts.GetOptions):
   option_list = (
         optparse.make_option("-p", "--prefix", action = "store_true",
            help = "Boolean flag to generate prefix", default = False,
            dest = "prefix"),
         optparse.make_option("-l", "--length", type = "int",
            help = "Length of the IPv6 prefix or address", dest = "length"),
         optparse.make_option("-P", "--prefixtype", action = "store",
            help = "Prefix type: ['none', 'wan', 'nan']",
            default = "none", type = "choice", choices = ["none", "wan", "nan"],
            dest = "prefixtype"),
         optparse.make_option("-d", "--description", type = "str",
            help = "Description for the address", dest = "description"),
         ) + getopts.GetOptions.option_list

   def __init__(self):
      super(Command, self).__init__()
      self.prog = __file__.split("/")[-1]

   def handle(self, **options):
      prefix = options.get("prefix")
      length = options.get("length")
      description = options.get("description")
      address = None
      if length:
         ipv6cls = ipv6.rfc4193(length, prefix)
         address = ipv6cls.GetIPv6()
         ipv6util = util.IPv6(address)

         if prefix:
            if ipv6util.ValidIPv6():
               print address
            else:
               print "%s: %s conflicts with existing ip: %s" %(
                     self.prog, address, ipv6util.conflict)
         else:
            print "%s: address with length %d: %s" %(self.prog, length, address)


